package main

import (
	"encoding/json"
	"fmt"
	"log"
	"time"
)

type Duck interface {
	jiao(xx int) string // 你叫起来像鸭子
	zou()               // zou起来像鸭子
	youyong()           // 游泳
}

type Yazi struct{}

func (yz *Yazi) jiao(a int) string {
	return "鸭子"
}

func (yz *Yazi) zou() {
}

func (yz *Yazi) youyong() {
}

func test() {
	m := make(map[string]interface{})

	m["code"] = 0
	if _, ok := m["code"]; ok {
		fmt.Println("code")
	} else {
		fmt.Println("not code")
	}
	m["msg"] = ""
	m["gender"] = true
	statuslist := make([]map[string]map[string]int, 0)
	aaa := make(map[string]map[string]int)
	age := map[string]int{"age": 19}
	aaa["aaa"] = age
	statuslist = append(statuslist, aaa)
	m["statuslist"] = statuslist
	b, err := json.Marshal(m)
	if err != nil {
		log.Fatal(err)
	}

	switch m["gender"].(type) {
	case []map[string]map[string]int:
		fmt.Println("statuslist")
	case bool:
		fmt.Println("gender")
	}

	// interface{}.(string)
	fmt.Println(m["statuslist"].([]map[string]map[string]int)[0]["aaa"]["age"])
	fmt.Println("aaaa")
	fmt.Println(string(b))
}

func tp() {
	age := AGE{
		Age: 19,
	}
	aaa := AAA{
		Aaa: age,
	}
	resp := &Resp{
		Statuslist: []AAA{aaa},
		Code:       0,
		Msg:        "",
		Gender:     true,
	}

	fmt.Println(resp.Statuslist[0].Aaa.Age)
	b, err := json.Marshal(resp)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("aaaa")
	fmt.Println(string(b))
}

type AGE struct {
	Age int `json:"age"`
}

type AAA struct {
	Aaa AGE `json:"aaa"`
}

type Resp struct {
	Statuslist []AAA  `json:"statuslist"`
	Code       int    `json:"code"`
	Msg        string `json:"msg"`
	Gender     bool   `json:"gender"`
}

// {
//     "statuslist": [
//         {
//             "aaa": {
//                 "age": 19
//             }
//         }
//     ],
//     "code": 0,
//     "msg": "",
//     "gender": True
// }
// string int map [] struct

// 3大主要方向， web, 游戏后端, 微服务

func deleteIndex(qiepian []int, index int) {
	// a := [1, 2, 5, 6, 6 ,7, 8, 8, 8]   a[:2] a[3:]
	fmt.Printf("%p\n", qiepian)
	fmt.Println(cap(qiepian))
	if index < 0 || index > len(qiepian) {
		return
	}
	qiepian = append(qiepian[:index], qiepian[index+1:]...)
	fmt.Printf("%p\n", qiepian)
	fmt.Println(cap(qiepian))
	fmt.Println(qiepian)
}
func A(b int) {
	b = 19
}

// [1,2,4,5,45,6]

func B(ch chan int) {

	time.Sleep(1 * time.Second)
	ch <- 1
	fmt.Println("我在洗衣服")
	ch <- 2

}

type Collections struct {
	ID        int    `json:"id"`
	Slug      string `json:"slug"`
	Title     string `json:"title"`
	Avatar    string `json:"avatar"`
	OwnerName string `json:"owner_name"`
}

// map
// ini  xml   yaml
type Foo struct {
	Collections []Collections `json:"collections"`
	Page        int           `json:"ppppppage" yaml:"aaaapage"`
	TotalPages  int           `json:"total_pages"`
}

// 快捷键：
// 注释   ctrl + /
// 复制此行粘贴到下一行 ctrl + d
// ctrl  调转到定义
// 回退   ctrl + alt + <-  | ->

// 反射

func ref() {
	// f := Foo{
	// 	Page: 10,
	// }
	// rv := reflect.ValueOf(f)
	// fmt.Println(rv.FieldByName("Page"))
	// rt := reflect.TypeOf(f)
	// ss, _ := rt.FieldByName("Page")
	// fmt.Println(ss.Tag.Get("json"))
}

func C() {
	ref()
	data := `
	{
		"collections": [{
			"id": 1939576,
			"slug": "601339335d47",
			"title": "网络模块",
			"avatar": "https://upload.jianshu.io/collections/images/1939576/WX20210202-094817_2x.png",
			"owner_name": "守护地中海的花"
		}, {
			"id": 1934961,
			"slug": "4a92bb5e2292",
			"title": "web前端",
			"avatar": "https://upload.jianshu.io/collections/images/1934961/crop1608832164816.jpg",
			"owner_name": "于心甚暖"
		}, {
			"id": 1885456,
			"slug": "a071ea36f167",
			"title": "铲子",
			"avatar": "https://upload.jianshu.io/collections/images/1885456/1590782695.jpg",
			"owner_name": "caskbear"
		}, {
			"id": 1819435,
			"slug": "227c8c6eabff",
			"title": "知识点",
			"avatar": "https://upload.jianshu.io/collections/images/1819435/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7_2019-09-17_%E4%B8%8B%E5%8D%886.10.05.png",
			"owner_name": "hello_JSH"
		}, {
			"id": 1879085,
			"slug": "be96d03105c5",
			"title": "提升",
			"avatar": "https://upload.jianshu.io/collections/images/1879085/1588774945.jpg",
			"owner_name": "想养猫而不得"
		}, {
			"id": 1859200,
			"slug": "b39c6e7aa1a6",
			"title": "http协议",
			"avatar": "https://upload.jianshu.io/collections/images/1859200/1582785448.jpg",
			"owner_name": "e9ad5dc70dd4"
		}, {
			"id": 1838074,
			"slug": "39d03b5ee2c8",
			"title": "Android",
			"avatar": "https://upload.jianshu.io/collections/images/1838074/4d21c98ada3167cfe516d70ed4fbed27.jpg",
			"owner_name": "隔水樵夫"
		}],
		"page": 1,
		"total_pages": 10
	}`
	foo := &Foo{}
	// 将字符串转结构体   json.Unmarshal
	err := json.Unmarshal([]byte(data), foo)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("-----", foo.Collections[0].ID)
	// 结构体转字符串  json.Marshal
	defer func() {
		if err := recover(); err != nil {
			fmt.Println(err)
		}
	}()
	zero := 0
	a := 6
	fmt.Println(a / zero)
}

func main() {
	// C()
	// test()
	// tp()
	// fmt.Println("11111")
	// a = B

	// ch := make(chan int)
	// fmt.Println("我开始要睡眠")
	// ch <- 1
	// // for i := 0; i < 100; i++ {
	// go B(ch) // 2k
	// // }
	// time.Sleep(2 * time.Second)
	// a := <-ch
	// fmt.Println(a)
	// fmt.Println("我醒了")
	// time.Sleep(2 * time.Second)

	// 运行了多长时间
	// a := []int{0, 1, 2, 3, 4}
	// fmt.Printf("%p\n", a)
	// fmt.Println(cap(a))
	// //删除第i个元素
	// i := 2
	// a = append(a[:i], a[i+1:]...)
	// fmt.Printf("%p\n", a)
	// fmt.Println(cap(a))
	// fmt.Println(a)
	// 传参数的时候，  只有2种， 值传递， 一个指针
	// 错误处理
	// 只有指针才能在函数内修改值才会影响原来的变量值
	// 只要传到函数里面的变量， 在函数里面的值做了修改后， 函数外面的值也做了修改，
	// 那么传进去的这个值就是指针
	// b := 20
	// map[]
	// int
	// float32
	// bool
	// string char[]
	// a := []int{1, 2, 5, 6, 6, 7, 8, 8, 8} // map[]
	// b := []int{1, 5, 6, 6, 7, 8, 8}
	// copy(a, b)
	// // deleteIndex(a, 1)
	// // A(b)
	// // fmt.Println(b)
	// fmt.Println(a)
	// fmt.Println(a + bi)

	// stu := pkg.NewStudent()
	// stu.Name = "王五"
	// stu.Hobby = []string{"打篮球", "看书", "玩游戏", "飞机"}

	// fmt.Println(stu.CheckName("王五"))
	// fmt.Println(pkg.CheckName(stu, "王五"))

	// fmt.Println(b)
	// format.print ln: line
	// int string []
	// 定义变量的方式 1, 可以在函数外面使用
	// var s string // ""
	// var s string = "hello world!"
	// 定义变量的方式 2， 不可以在函数外面使用
	// s := "hello world!"

	// (f) 切片类型 make 时 有三个参数， 第一个是切片的类型
	// 第二个是 长度
	// 第三个容量
	// qiepian := make([]string, 8, 10)
	// 切片增删改查
	// 增
	// fmt.Println(cap(qiepian)) // capacity
	// ------------ 数组里面分配空间是连续的
	// ------------[] 数组里面分配空间是连续的 1
	// -------------------------             2
	// fmt.Printf("%p \n", qiepian)
	// qiepian = append(qiepian, "1", "2", "4")
	// fmt.Printf("%p \n", qiepian)
	// fmt.Println(cap(qiepian))

	// char a[] = "hello world"
	// x := 10
	// 修改
	// qiepian[10] = "5"
	// fmt.Println(qiepian) //  [        1 2 5]
	// // 查
	// for index, value := range qiepian {
	// 	fmt.Println(i, v)
	// }

	// 删除
	// for index, value := range qiepian {
	// 	fmt.Println(i, v)
	// }

	// 指针
	// &:  取地址符号
	// *： 声明的时候表示 是一个指针，  如果变量使用的时候， 那么就是取指针的值
	// s := "hello"
	// fmt.Println(&s)
	// s = "hello world"
	// fmt.Println(&s)

	// (h) Map 类型
	// 查看长度
	// 容量 cap
	/// map 2个   第一个是map的类型 第二个容量
	// m := make(map[int]string, 10)

	// s := []int{10}

	// map的增删改查
	// 增改 固定写法
	// m[10] = "hello world"
	// m[10] = "hello"
	// // 查
	// fmt.Println(len(m))

	// for k, v := range m {
	// 	fmt.Println(k, "---", v)
	// }

	// // 删除
	// delete(m, 10)
	// fmt.Println(m)

	// b := "6"
	// 将int 转 string
	// as := strconv.Itoa(a)
	// 将 string转 int
	// bi, err := strconv.Atoi(b)
	// if err != nil {
	// 	fmt.Println(err)
	// 	return
	// }
	// zero := 0
	// a := 6
	// fmt.Println(a / zero)
	// Test()
	// fileHandle()
	// a := "433"
	// 0x: 16进制
	// 0: 8 进制
	// -rwxr-xr-x 1 root root 202673246 Jul 10 09:27 09shop.sql
	// 一共10位：
	// 第一位是 ： 文件标识   - 标识是文件  d  文件夹  l link
	// 第一段： 3位    文件所属者的权限， 上面标识 root
	//  第二段： 3位   文件所属组的权限， 上面标识 root
	// 第三段： 3位    其他用户(非所属用户)
	// r:  read
	// w:  write
	// x:  执行
	// 1 1 1
	// 4,2,1
	// 1 1 0
	// 1 0 0
	// fmt.Println(0644) // -rw-r--r--
	// fmt.Println(&a)
	// defer fmt.Println(1111)
	// fmt.Println(2222)
}

func Test() {
	for {
		time.Sleep(1 * time.Second)
	}
}

// 文件操作

//  文件， 网络连接也是文件  close，
// defer
func fileHandle() {
	// os.MkdirAll()  创建文件夹
	// os.Link()    创建链接
	// O_WRONLY: write only
	// f, err := os.OpenFile("test1.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) // 1.16

	// // f, err := os.Open("test.log")
	// if err != nil {
	// 	log.Fatal(err) // log.Println()  ; os.exit(1)
	// }

	// defer f.Close() // 第一大特性， 其他语言没见到
	// f.Close()
	// f.WriteString()
	// fmt.Println(string(b))
	// todonig拿到字符串
	// if err != nil {
	// 	return // log.Println()  ; os.exit(1)
	// }
	// a := "这是用go写的内容"
	// 5Tb  硬盘 :   50M/s
	// f.WriteString(a)

	// fmt.Println((1024 * 1024 * 5) / 50) // cpu, 内存， 硬盘
	// err := os.WriteFile("test.log", []byte(a), 0644)
	// if err != nil {
	// 	log.Fatal(err) // log.Println()  ; os.exit(1)
	// }

	// b := make([]byte, 3)

	// for {
	// 	n, err := f.Read(b)
	// 	if err != nil {
	// 		if err == io.EOF {
	// 			break
	// 		}
	// 		log.Fatal(err) // log.Println()  ; os.exit(1)
	// 	}
	// 	fmt.Println(n)
	// 	fmt.Println(string(b))
	// }

}

// utf8, 一个中文就占3byte
